#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld\n", (x))
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
typedef long long ll;
const int N = 407;
int a[N];
ll qkpow(ll a, ll b) {
    ll ans = 1;
    while (b) {
        if (b & 1) ans = ans * a;
        a = a * a;
        b >>= 1;
    }
    return ans;
}
int n, k, p, top = 1, sum;
vector<int> res, tmp;

void dfs(int now) {
    int d = n - now, up = 1;
    if (d < 0 || tmp.size() > k) return;
    while (a[up] <= d && up <= top) ++up;
    for (int i = up; i; --i) {
        tmp.push_back(i);
        now += a[i];
        if (now == n && tmp.size() == k) {  // ok
            if (!sum) {
                for (int x : tmp) sum += x;
                res = tmp;
            } else {
                int tmpSum = 0;
                for (int x : tmp) tmpSum += x;
                if (tmpSum > sum) {
                    sum = tmpSum;
                    res = tmp;
                }
            }
        }
        dfs(now);
        now -= a[i];
        tmp.pop_back();
    }
}
int main() {
    scanf("%d%d%d", &n, &k, &p);
    rep(i, 1, n) {
        a[i] = qkpow(i, p);
        if (a[i] > n) {
            top = i;
            break;
        }
    }
    dfs(0);

    if (sum != 0) {
        printf("%d = ", n);
        for (int i = 0; i < res.size(); ++i) {
            printf("%d^%d", res[i], p);
            if (i != res.size() - 1) printf(" + ");
        }
    } else
        puts("Impossible");

    return 0;
}